首页 > 解决方案 > java.lang.IllegalStateException:设置正文参数时名称为空

问题描述

我有以下对某个系统的 POST 请求的示例。

请求如下所示:

在此处输入图像描述

我尝试使用以下方法实现它:

/**
     * This method creates a HTTP POST/PUT/PATCH request and fills body
     * with data from Map
     * @param urlToPrepareRequest URL for a request
     * @param keyValueToPutInBodyRequest Map of entities to put in body request
     * @param httpMethod HTTP method (POST, PUT, PATCH are available)
     * @throws IllegalArgumentException if httpMethod is wrong
     * @return ready HTTP POST/PUT/PATCH with filled body
    */
    public static HttpEntityEnclosingRequestBase createHttpRequestAndFillBody(String urlToPrepareRequest, Map<String, Object> keyValueToPutInBodyRequest, String httpMethod) 
{
    HttpEntityEnclosingRequestBase httpRequest;

    if (httpMethod.equals("POST")) 
    {
        httpRequest = new HttpPost(urlToPrepareRequest);
    }
    else if (httpMethod.equals("PUT")) 
    {
        httpRequest = new HttpPut(urlToPrepareRequest);
    }
    else if (httpMethod.equals("PATCH")) 
    {
        httpRequest = new HttpPatch(urlToPrepareRequest);
    }
    else throw new IllegalArgumentException("HTTP method can't be used " + httpMethod + " available values are \"POST\", \"PUT\", \"PATCH\"");

    Iterator it = keyValueToPutInBodyRequest.entrySet().iterator();

    MultipartEntityBuilder builder = MultipartEntityBuilder.create();

    while (it.hasNext()) 
    {   
        Map.Entry pair = (Map.Entry)it.next();

        String keyOfBodyToPut = (String) pair.getKey();
        Object valueOfBodyToPut = pair.getValue();

        if(!(valueOfBodyToPut instanceof byte[])) 
        {
            builder.addTextBody(keyOfBodyToPut, valueOfBodyToPut.toString());
        }
        else 
        {
            builder.addBinaryBody(keyOfBodyToPut, (byte[]) valueOfBodyToPut);
        }
    } 

    HttpEntity entity = builder.build();
    httpRequest.setEntity(entity);

    return httpRequest;
}

但是,我得到以下异常:

Exception in thread "main" java.lang.IllegalStateException: Name is blank
    at org.apache.http.util.Asserts.notBlank(Asserts.java:64)
    at org.apache.http.entity.mime.FormBodyPartBuilder.build(FormBodyPartBuilder.java:96)
    at org.apache.http.entity.mime.MultipartEntityBuilder.addPart(MultipartEntityBuilder.java:148)
    at org.apache.http.entity.mime.MultipartEntityBuilder.addBinaryBody(MultipartEntityBuilder.java:163)
    at org.apache.http.entity.mime.MultipartEntityBuilder.addBinaryBody(MultipartEntityBuilder.java:168)

这都是因为在地图内部有以下代码:

bodyParams.put("", currentChunk);

currentChunk是类型byte []。起初,我认为可以在正文请求中放置一个空键(因为在上面的屏幕上没有键),但现在它让我觉得可能不是。

有什么问题?

以及如何使我的方法更符合邮递员的要求?

提前致谢。

标签: javaresthttppostapache-httpclient-4.x

解决方案


推荐阅读