URL의 매개 변수로 JSON 배열을 전달하는 방법
웹 서비스 호출에서 모바일에서 서버로 일부 값을 전달해야 하기 때문에 아래와 같이 모든 값을 JSON 형식으로 전달할 예정입니다.
{
"nameservice": [
{
"id": 7413,
"name": "ask"
},
{
"id": 7414,
"name": "josn"
},
{
"id": 7415,
"name": "john"
},
{
"id": 7418,
"name": "R&R"
}
]
}
서비스 콜은 다음과 같습니다.
@RequestMapping("/saveName")
@ResponseBody
public String saveName(String acc)
{jsonObject = new JSONObject();
try
{
);
System.out.println(acc);
jsonObject.accumulate("result", "saved ");
}
catch(Exception e)
{
e.printStackTrace();jsonObject.accumulate("result", "Error Occured ");
}
return jsonObject.toString();
}
위와 같은 서비스를 호출하려고 합니다.
localhost:8080/service/saveName?acc={ "nameservice": [ { "id": 7413, "name": "ask" }, { "id": 7414, "name": "josn" }, { "id": 7415, "name": "john" }, { "id": 7418, "name": "R&R" } ] }
하지만 출력은 이렇습니다.
{ "nameservice": [ { "id": 7413, "name": "ask" }, { "id": 7414, "name": "josn" }, { "id": 7415, "name": "john" }, { "id": 7418, "name": "R
내가 왜 모든 가치를 얻지 못하는지 말해줄 수 있는 사람 있나요?
저는 JSON 데이터를 본문에 전달하고 싶습니다.POST부탁한다.다만, 이것을 URL내의 파라메타로서 전달하려면 , 예를 들면 다음과 같이 URL을 부호화할 필요가 있습니다.
ex json의 경우 :->{"name":"ABC","id":"1"}
testurl:80/service?data=%7B%22name%22%3A%22ABC%22%2C%22id%22%3A%221%22%7D
URL 인코딩에 대한 자세한 내용은 아래를 참조하십시오.
https://en.wikipedia.org/wiki/Percent-encoding
나중에 투고할 수 있다는 것은 알지만, 새로운 방문자를 위해 솔루션을 공유하겠습니다.OP가 JSON 오브젝트를 GET 경유로 전달할 수 있는 방법을 요청했기 때문입니다(다른 답변에서는 POST가 아닙니다).
- JSON 개체를 가져와 문자열(JSON.stringify)로 변환합니다.
- 문자열을 Base64로 인코딩합니다(여기에서 유용한 정보를 찾을 수 있습니다).
- URL에 추가하여 GET 콜을 발신합니다.
- 프로세스를 반대로 합니다.그것을 디코딩하여 오브젝트로 해석하다
GET 콜밖에 할 수 없는 경우에 이 기능을 사용하고 있습니다.또한 이 솔루션은 사실상 크로스 언어입니다.
오래된 건 알지만 왜 위와 같은 불완전한 json이 생겼는지 알고 싶은 사람은 앰퍼샌드 때문입니다.&는 파라미터를 구분하기 위해 사용되는 URL의 특수 문자입니다.
데이터에는 앰퍼샌드가 있습니다.R&Racc 파라미터는 앰퍼샌드 문자에 도달하면 종료됩니다.
그래서 잘린 데이터를 얻을 수 있습니다.솔루션은 승인된 솔루션과 같이 url에서 데이터를 인코딩하거나 POST로 전송하는 것입니다.
& 는, 다음의 파라메타의 키워드입니다.이러한 ur?param1=1¶m2=2
R"이라는 이름의 두 번째 매개 변수를 효과적으로 전송합니다.당신은 그래야 한다.urlencode당신의 끈.POST는 옵션 아닌가요?
이 방법으로 승인 헤더와 함께 json 입력을 POST 요청으로 전달할 수 있습니다.
public static JSONObject getHttpConn(String json){
JSONObject jsonObject=null;
try {
HttpPost httpPost=new HttpPost("http://google.com/");
org.apache.http.client.HttpClient client = HttpClientBuilder.create().build();
StringEntity stringEntity=new StringEntity("d="+json);
httpPost.addHeader("content-type", "application/x-www-form-urlencoded");
String authorization="test:test@123";
String encodedAuth = "Basic " + Base64.encode(authorization.getBytes());
httpPost.addHeader("Authorization", security.get("Authorization"));
httpPost.setEntity(stringEntity);
HttpResponse reponse=client.execute(httpPost);
InputStream inputStream=reponse.getEntity().getContent();
String jsonResponse=IOUtils.toString(inputStream);
jsonObject=JSONObject.fromObject(jsonResponse);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return jsonObject;
}
이 메서드는 json 응답을 반환합니다.같은 방법으로 GET 메서드를 사용할 수 있습니다.
예를 들어 Next.js 프레임워크와 연동되는 범용 솔루션(노드+브라우저)을 만들었습니다.
한다. (에)json-stringify-safe
불필요한 데이터를 제거하기 위해 그 위에 시리얼라이저를 구축했습니다(2k자를 넘는 URL을 사용하는 것은 권장되지 않기 때문에 다른 브라우저에서 URL의 최대 길이는 얼마입니까?를 참조하십시오).
import StringifySafe from 'json-stringify-safe';
export const encodeQueryParameter = (data: object): string => {
return encodeURIComponent(StringifySafe(data)); // Use StringifySafe to avoid crash on circular dependencies
};
export const decodeQueryParameter = (query: string): object => {
return JSON.parse(decodeURIComponent(query));
};
유닛 테스트(제스트):
import { decodeQueryParameter, encodeQueryParameter } from './url';
export const data = {
'organisation': {
'logo': {
'id': 'ck2xjm2oj9lr60b32c6l465vx',
'linkUrl': null,
'linkTarget': '_blank',
'classes': null,
'style': null,
'defaultTransformations': { 'width': 200, 'height': 200, '__typename': 'AssetTransformations' },
'mimeType': 'image/png',
'__typename': 'Asset',
},
'theme': {
'primaryColor': '#1134e6',
'primaryAltColor': '#203a51',
'secondaryColor': 'white',
'font': 'neuzeit-grotesk',
'__typename': 'Theme',
'primaryColorG1': '#ffffff',
},
},
};
export const encodedData = '%7B%22organisation%22%3A%7B%22logo%22%3A%7B%22id%22%3A%22ck2xjm2oj9lr60b32c6l465vx%22%2C%22linkUrl%22%3Anull%2C%22linkTarget%22%3A%22_blank%22%2C%22classes%22%3Anull%2C%22style%22%3Anull%2C%22defaultTransformations%22%3A%7B%22width%22%3A200%2C%22height%22%3A200%2C%22__typename%22%3A%22AssetTransformations%22%7D%2C%22mimeType%22%3A%22image%2Fpng%22%2C%22__typename%22%3A%22Asset%22%7D%2C%22theme%22%3A%7B%22primaryColor%22%3A%22%231134e6%22%2C%22primaryAltColor%22%3A%22%23203a51%22%2C%22secondaryColor%22%3A%22white%22%2C%22font%22%3A%22neuzeit-grotesk%22%2C%22__typename%22%3A%22Theme%22%2C%22primaryColorG1%22%3A%22%23ffffff%22%7D%7D%7D';
describe(`utils/url.ts`, () => {
describe(`encodeQueryParameter`, () => {
test(`should encode a JS object into a url-compatible string`, async () => {
expect(encodeQueryParameter(data)).toEqual(encodedData);
});
});
describe(`decodeQueryParameter`, () => {
test(`should decode a url-compatible string into a JS object`, async () => {
expect(decodeQueryParameter(encodedData)).toEqual(data);
});
});
describe(`encodeQueryParameter <> decodeQueryParameter <> encodeQueryParameter`, () => {
test(`should encode and decode multiple times without altering data`, async () => {
const _decodedData: object = decodeQueryParameter(encodedData);
expect(_decodedData).toEqual(data);
const _encodedData: string = encodeQueryParameter(_decodedData);
expect(_encodedData).toEqual(encodedData);
const _decodedDataAgain: object = decodeQueryParameter(_encodedData);
expect(_decodedDataAgain).toEqual(data);
});
});
});
@RE350이 제안했듯이 포스트에서 본문에 JSON 데이터를 전달하는 것이 이상적입니다.그러나 GET 요청의 매개 변수로 json 개체를 전송하고 서버 측 로직에서 json 문자열을 디코딩하여 개체로 사용할 수 있습니다.
예를 들어 php를 사용하는 경우 다음과 같이 할 수 있습니다(다른 언어로 된 적절한 json 디코딩 사용).
서버 요청:
http://<php script>?param1={"nameservice":[{"id":89},{"id":3}]}
서버:
$obj = json_decode($_GET['param1'], true);
$obj["nameservice"][0]["id"]
출력:
89
Json 데이터 문자열을 웹 주소로 전송하고 메서드 게시 결과를 가져옵니다.
C#에서
public string SendJsonToUrl(string Url, string StrJsonData)
{
if (Url == "" || StrJsonData == "") return "";
try
{
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(Url);
request.Method = "POST";
request.ContentType = "application/json";
request.ContentLength = StrJsonData.Length;
using (var streamWriter = new StreamWriter(request.GetRequestStream()))
{
streamWriter.Write(StrJsonData);
streamWriter.Close();
var httpResponse = (HttpWebResponse)request.GetResponse();
using (var streamReader = new StreamReader(httpResponse.GetResponseStream()))
{
var result = streamReader.ReadToEnd();
return result;
}
}
}
catch (Exception exp)
{
throw new Exception("SendJsonToUrl", exp);
}
}
PHP에서
<?php
$input = file_get_contents('php://input');
$json = json_decode($input ,true);
?>
let qs = event.queryStringParameters;
const query = Object.keys(qs).map(key => key + '=' + qs[key]).join('&');
언급URL : https://stackoverflow.com/questions/27577922/how-to-pass-a-json-array-as-a-parameter-in-url
'programing' 카테고리의 다른 글
| angular.js의 커스텀필터 의존관계로서 서비스를 주입하는 방법 (0) | 2023.03.16 |
|---|---|
| react-module v6: 현재 루트의 경로 패턴 가져오기 (0) | 2023.03.16 |
| bash에서 CSV를 JSON으로 변환 (0) | 2023.03.16 |
| angularJS - 마우스 클릭으로 x 및 y 위치 가져오기(div) (0) | 2023.03.16 |
| Ubuntu VPS에서 Spring Boot Actuator 응용 프로그램이 시작되지 않음 (0) | 2023.03.16 |